'''
依赖倒转原则：
1、高层模块不依赖与低层模块，都应依赖于抽象或者接口。（高层：抽象度高；低层：抽象度低）
2、抽象不应该依赖于细节，细节应依赖于抽象。（细节指具体的实例。）

实现的核心：父类存在的地方，可以用其子类将其替换。（有点像里氏替换原则）
'''
from abc import abstractmethod, ABC


class AbstractRecive(ABC):  # 注意，此处不再继承object对象了
    '''
    一个抽象的接收类
    '''

    @abstractmethod
    def message(self):
        pass


class Email(AbstractRecive):
    '''
    具体实现类 Email
    '''
    def message(self):
        print("===>>> this is Email's message!")


class WeChart(AbstractRecive):
    '''
    具体实现类 WeChart
    '''
    def message(self):
        print("===>>> this is WeChart's message!")


class Person(object):
    '''
    调用具体实现类的类
    如：xxx收到了xx类型的消息。
    '''

    def showMessage(self, recive):  # recive可以理解是一个抽象实例
        recive.message()


if __name__ == "__main__":
    per = Person()
    per.showMessage(WeChart())  # 可以理解为用具体实例替换了抽象实例

    dict.get()
